﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SuperSocket.Facility.Protocol;
using SuperSocket.SocketBase.Protocol;

namespace SocketServer.ServerBase
{
    public class ClientRequestPackReceiveFilter : FixedHeaderReceiveFilter<BinaryRequestInfo>
    {
        // 协议定义规则
        // +-------+---+-------------------------------+
        // |request | l  |                               |
        // | name   | e |    request body       |
        // |  (16)     | n |                               |
        // |             |(4)|                               |
        // +-------+---+-------------------------------+
        // 其中前16位字节存储请求命令的名称，
        // 第17-20位存储请命令主体的总子节数(字节数组的长度)

        /// <summary>
        /// 客户端请求协议解析类
        /// </summary>
        public ClientRequestPackReceiveFilter()
            : base(20)
        {
            // 首先我们看到构造函数base(20)里面的输入了一个20，
            // 这个20是协议头的长度，也就是request name 加 len的长度
        }
       
        protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
        {
            //取得到协议头的数据，就是在header从偏移量offset开始截取长度为length的部分数组
            //但是我们的协议头是20位，要取打包数据的长度那么就需要从偏移offset上再加16位
            var headerData = new byte[4];
            Array.Copy(header, offset + 16, headerData, 0, 4);
            return BitConverter.ToInt32(headerData, 0);
        }

        protected override BinaryRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
        {
            string key = Encoding.UTF8.GetString(header.Array, header.Offset, 10);
            key = key.Replace("\0", "");
            byte[] body = bodyBuffer.Skip(offset).Take(length).ToArray();
            return new BinaryRequestInfo(key, body);
        }
    }
}
